package persistencia;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.LinkedList;
import java.util.List;

import com.sun.org.apache.xml.internal.serializer.utils.Utils;

import dominio.Enfermo;
import dominio.Socio;
import dominio.Usuario;

public class AgenteBD {

	private Conexion conexion;
	private static AgenteBD instance = null;

	public static AgenteBD getInstance() {
		if (instance == null) {
			instance = new AgenteBD();
		}
		return instance;
	}

	private AgenteBD() {
		this.conexion = new Conexion();
	}

	public void createUser(String login, String password, String realname,
			boolean admin) throws SQLException {
		this.conexion.connect();
		String query = "INSERT INTO user VALUES ('" + login + "', '"
				+ utils.Utils.md5sum(password) + "', '" + realname + "', '"
				+ ((admin) ? ("1") : ("0")) + "');";
		this.conexion.update(query);
		this.conexion.disconnect();
	}
	
	public void deleteUser(String login) throws SQLException{
		String query = "DELETE FROM user WHERE login = '" + login + "'";
		this.conexion.connect();
		this.conexion.update(query);
		this.conexion.disconnect();
	}

	public Usuario login(String login, String password) throws SQLException {
		Usuario res = null;
		String query = "SELECT * FROM user WHERE login = '" + login
				+ "' AND password = '" + utils.Utils.md5sum(password) + "';";
		this.conexion.connect();
		ResultSet r = this.conexion.execute(query);
		if (r.next()) {
			String nombre = r.getString("realname");
			boolean admin = ((r.getString("admin").equals("1")) ? (true)
					: (false));
			res = new Usuario(nombre, login, password, admin);
		}
		this.conexion.disconnect();
		return res;
	}

	public List<Usuario> getAllUsers() throws SQLException {
		List<Usuario> list = null;
		String query = "SELECT * FROM user";
		this.conexion.connect();
		ResultSet r = this.conexion.execute(query);
		list = new LinkedList<Usuario>();
		while (r.next()) {
			String nombre = r.getString("realname");
			String login = r.getString("login");
			String pass = r.getString("password");
			boolean admin = r.getString("admin").equals("1");
			list.add(new Usuario(nombre, login, pass, admin));
		}
		this.conexion.disconnect();
		return list;
	}
	
	public void saveSocio(Socio soc) throws SQLException{
		String query = "";
		query += "INSERT INTO socio VALUES (" + soc.getId() + ", '" + soc.getFecha_alta() + "', " + nullOrIt(soc.getFecha_baja()) + ", " + nullOrIt(soc.getFecha_baja()) + ", '" + ((soc.isSeguro_mapfre() == true)?("si"):("no")) +"', '" + soc.getNombre() + "', '" + soc.getApellidos() + "', '" + soc.getFecha_nacimiento() + "', '" + soc.getSexo() + "', '" + soc.getDni() + "', " + nullOrIt(soc.getEstado_civil()) + ", '" + soc.getDireccion() + "', " + soc.getCp() + ", '" + soc.getLocalidad() + "', '" + soc.getProvincia() + "', '" + soc.getTelefono() + "', " + ((soc.getTelefono_movil() == null)?("NULL"):("'" + soc.getTelefono_movil() + "'")) + ", " + nullOrIt(soc.getNivel_estudios()) +", " + nullOrIt(soc.getProfesion()) + ", " + ((soc.getCc() == null)?("NULL"):("'" + soc.getCc() + "'")) + ", '" + ((soc.isVoluntario())?("si"):("no")) + "', " + ((soc.getCurso_formacion() == 0)?("NULL"):(soc.getCurso_formacion())) + ", '" + soc.getInteres() + "', " + nullOrIt(soc.getComentarios()) + ")";
		System.out.println("SQL Query:\n\t" + query);		
		this.conexion.connect();
		this.conexion.update(query);
		this.conexion.disconnect();		
		if(soc instanceof Enfermo){			
			Enfermo e = (Enfermo)soc;
			String query2 = "INSERT INTO enfermo VALUES (" + e.getId() + ", '" + e.getDiagnostico() + "', " + nullOrIt(e.getFecha_diagnostico()) + ", '" + ((e.isAcude_ud_salud_mental())?("si"):("no")) + "', " + nullOrIt(e.getTipo_minusvalia()) +", " + nullOrIt(e.getGrado_minusvalía()) +", '" + ((e.isDerivado_crpsl())?("si"):("no")) + "', " + nullOrIt(e.getTipo_convivencia()) + ", " + nullOrIt(e.getSituacion_laboral()) + ", '" + ((e.isIngresos_propios())?("si"):("no")) +"', " + nullOrIt(e.getNivel_ingresos()) + ", " + nullOrIt(e.getProcedencia_ingresos()) + ", " + nullOrIt(e.getSituacion_legal()) + ", " + nullOrIt(e.getFundacion_madre()) + ")";
			System.out.println("\t" + query2);		
			this.conexion.connect();
			this.conexion.update(query2);
			this.conexion.disconnect();
		}				
	}
	
	private String nullOrIt(String s){
		return ((s == null)?("NULL"):("'" + s + "'"));
	}
	
	public List<Socio> getAllSocios() throws NumberFormatException, SQLException{
		List<Socio> list = new LinkedList<Socio>();
		String query = "";
		this.conexion.connect();
		ResultSet r = this.conexion.execute(query);
		while (r.next()) {
			Socio s = null;
			//Comunes a todos los socios
			int id = Integer.parseInt(r.getString("id"));
			String fecha_alta = r.getString("fecha_alta");
			String fecha_baja = r.getString("fecha_baja");
			String causa_baja = r.getString("causa_baja");
			boolean seguro_mapfre = r.getString("seguro_mapfre").equals("1");
			String nombre = r.getString("nombre");
			String apellidos = r.getString("apellidos");
			String fecha_nacimiento = r.getString("fecha_nacimiento");
			String sexo = r.getString("sexo");
			String dni= r.getString("dni");
			String estado_civil = r.getString("estado_civil");
			String direccion = r.getString("direccion");
			int cp = Integer.parseInt(r.getString("cp"));
			String localidad = r.getString("localidad");
			String provincia = r.getString("provincia");
			String telefono = r.getString("telefono");
			String telefono_movil = r.getString("telefono_movil");
			String nivel_estudios = r.getString("nivel_estudios");
			String profesion = r.getString("profesion");
			String cc = r.getString("cc");
			boolean voluntario = r.getString("voluntario").equals("1");
			int curso_formacion = Integer.parseInt(r.getString("curso_formacion"));
			String interes = r.getString("interes");
			String comentario = r.getString("comentario");			
			
			//Especificas del enfermo
			String diagnostico = r.getString("diagnostico");
			String fecha_diagnostico = r.getString("fecha_diagnostico");
			boolean acude_ud_salud_mental = r.getString("acude_ud_salud_mental").equals("1");
			String tipo_minusvalia = r.getString("tipo_minusvalia");
			String grado_minusvalia = r.getString("grado_minusvalia");
			boolean derivado_crpsl = r.getString("derivado_crpsl").equals("true");
			String tipo_convivencia = r.getString("tipo_convivencia");
			String situacion_laboral = r.getString("situacion_laboral");
			boolean ingresos_propios = r.getString("ingresos_propios").equals("1");
			String procedencia_ingresos = r.getString("procedencia_ingresos");
			String nivel_ingresos = r.getString("nivel_ingresos");
			String situacion_legal = r.getString("situacion_legal");
			String fundacion_madre = r.getString("fundacion_madre");
			
			if(interes.equals("persona con enfermedad")){
				s = new Enfermo(id, fecha_alta, fecha_baja, causa_baja, seguro_mapfre, nombre, apellidos, fecha_nacimiento, sexo, dni, estado_civil, direccion, localidad, provincia, telefono, telefono_movil, nivel_estudios, profesion, cc, voluntario, cp, curso_formacion, comentario, diagnostico, fecha_diagnostico, acude_ud_salud_mental, derivado_crpsl, tipo_minusvalia, grado_minusvalia, tipo_convivencia, situacion_laboral, ingresos_propios, nivel_ingresos, procedencia_ingresos, situacion_legal, fundacion_madre);
			} else {
				s = new Socio(id, fecha_alta, fecha_baja, causa_baja, seguro_mapfre, nombre, apellidos, fecha_nacimiento, sexo, dni, estado_civil, direccion, localidad, provincia, telefono, telefono_movil, nivel_estudios, profesion, cc, voluntario, cp, curso_formacion, interes, comentario);
			}
			list.add(s);
		}
		this.conexion.disconnect();
		return list;
	}

}
